#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"
#include "iot_gpio.h"
#include "iot_watchdog.h"
#include "iot_pwm.h"

static int g_beepState = 0;

static void *PWMBeerTask(const char *arg)
{
    (void)arg;

    printf("PWMBeerTask start!\r\n");
    
    while (1) {
        if (g_beepState) {
            //oTPwmStart(HI_IO_NAME_GPIO_9, 20*1000, 40*1000);
            hi_pwm_start(HI_IO_NAME_GPIO_9, 20*1000, 40*1000);
        } else {
            //IoTPwmStop(HI_IO_NAME_GPIO_9);
            hi_pwm_stop(HI_IO_NAME_GPIO_9);
        }
    }

    return NULL;
}

static void OnButtonPressed(char *arg)
{
    (void) arg;
    g_beepState = !g_beepState;
}

static void StartPWMBeerTask(void)
{
    osThreadAttr_t attr;
    hi_gpio_init();
    //IoTGpioInit(HI_IO_NAME_GPIO_8);
    hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_GPIO);
    //IoTGpioSetDir(HI_IO_NAME_GPIO_8, HI_GPIO_DIR_IN);
    hi_gpio_set_dir(HI_IO_NAME_GPIO_8, HI_GPIO_DIR_IN);
    hi_io_set_pull(HI_IO_NAME_GPIO_8, HI_IO_PULL_UP);
    //IoTGpioRegisterIsrFunc(HI_IO_NAME_GPIO_8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, OnButtonPressed, NULL);
    hi_gpio_register_isr_function(HI_IO_NAME_GPIO_8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, OnButtonPressed, NULL);
    //IoTGpioInit(HI_IO_NAME_GPIO_9);
    hi_gpio_init();
    hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_PWM0_OUT);
    //IoTGpioSetDir(HI_IO_NAME_GPIO_9, HI_GPIO_DIR_OUT);
    hi_gpio_set_dir(HI_IO_NAME_GPIO_8, HI_GPIO_DIR_IN);
    //IoTPwmInit(HI_IO_NAME_GPIO_9);
    hi_pwm_init(HI_IO_NAME_GPIO_9);


    //IoTWatchDogDisable();
    hi_watchdog_disable();

    attr.name = "PWMBeerTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;

    if (osThreadNew((osThreadFunc_t)PWMBeerTask, NULL, &attr) == NULL) {
        printf("[StartPWMBeerTask] Falied to create PWMBeerTask!\n");
    }
}

SYS_RUN(StartPWMBeerTask);